package main

import "fmt"

func array() {
	// 一位数组定义方式
	var arr1 [5]int
	arr2 := [3]int {1, 2, 3}
	arr3 := [...]int{2, 4, 6, 8 ,10}

	// 二维数组: 4行5列
	var grid [4][5]int

	fmt.Println(arr1)
	fmt.Println(arr2)
	fmt.Println(arr3)
	fmt.Println(grid)

	// 1.遍历
	for i:= 0; i < len(arr3); i++{
		fmt.Print(arr3[i], " ")
	}

	// 2.遍历: range
	fmt.Print("\n")
	for i := range arr3 {
		fmt.Println(arr3[i], " ")
	}

	// 相当于 python中的 enumerate(), 遍历 索引和 值
	// 如果只想要值， 可以 for _, v := range arr3, 下划线代替
	for i, v := range arr3 {
		fmt.Println(i, v)
	}

	// 为什么要使用range， 1. 简洁美观。 2. 
}

func arr() {
	arr := [...]int {1, 2, 3, 4 ,5 ,6 ,7 ,8}
	s1 := arr[2:6]  // s = [3, 4, 5, 6]
	// s2 := s1[3:5]	// s = [6 ,7]
	// s3 := s1[3]   // s = [6]

	// s4 := s3[5:]

	// fmt.Println(arr)
	// fmt.Println(s1)
	// fmt.Println(s2)
	// fmt.Println(s3)
	// fmt.Println(s4)

	fmt.Printf("s1= %v, len(s1)=%d, cap(s1)= %d\n", s1, len(s1), cap(s1))
	s2 := append(s1, 10)
	s3 := append(s2, 11)
	s4 := append(s3, 12)
	s5 := append(s4, 13)
	// s5[1] = 222
	fmt.Println(s1)
	fmt.Println(s2)
	fmt.Println(s3)
	fmt.Println(s4)
	fmt.Println(s5)
	fmt.Println(arr)

	var qo []int
	fmt.Println(qo == nil)

	var s []int   // 默认为 nil, go中变量 定义不初始化也行

	// 可以进行append
	for i := 0; i < 100; i++ {
		// fmt.Printf("len(s)=%d, cap(s)= %d\n", len(s), cap(s))
    	s = append(s, i * 2 + 1)
	}

	ss1 := []int {1, 2, 3, 4}
	ss2 := make([]int, 16, 32)
	copy(ss2, ss1)
	fmt.Println(ss1)
	fmt.Println(ss2)
	ss2 = append(ss2[:3], ss2[4:]...)
	fmt.Println(ss2)
}

func main() {
	fmt.Println("数组")
	array()
	arr()
}

